package controller

import (
	"github.com/gomodule/redigo/redis"
	"github.com/olivere/elastic/v7"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/logger"
	"log"
	"strings"
	"testGin/entity"
	"testGin/tool"
	"time"
)

var db *gorm.DB
var es_client *elastic.Client
var pool *redis.Pool

var AccessKey string
var SecretKey string

var Bucket string
var Domain string
var Pipline string

var Host string
var Port string

var RedisHost string
var RedisPort string
var EsHost string
var EsPort string

type Pool struct {
	Dial            func() (redis.Conn, error) //连接方法
	TestOnBorrow    func(c redis.Conn, t time.Time) error
	MaxIdle         int           //最大的空闲连接数，即使没有redis连接时依然可以保持N个空闲的连接，而不被清除，随时处于待命状态
	MaxActive       int           //最大的激活连接数，同时最多有N个连接
	IdleTimeout     time.Duration //空闲连接等待时间，超过此时间后，空闲连接将被关闭
	Wait            bool          //当配置项为true并且MaxActive参数有限制时候，使用Get方法等待一个连接返回给连接池
	MaxConnLifetime time.Duration
}

func init() {
	cfg, _ := tool.ParseConfig("./config/app.json")
	AccessKey = cfg.Accesskey
	SecretKey = cfg.SecretKey
	Bucket = cfg.Bucket
	Domain = cfg.Domain
	Pipline = cfg.Pipline
	Host = cfg.AppHost
	Port = cfg.AppPort
	RedisHost = cfg.RedisHost
	RedisPort = cfg.RedisPort
	EsHost = cfg.ESHost
	EsPort = cfg.ESPort

	// Orm框架 MySQL启动
	/* 			MySQL			*/
	var err error
	// 想要正确的处理 time.Time ，您需要带上 parseTime 参数
	// 要支持完整的 UTF-8 编码，您需要将 charset=utf8 更改为 charset=utf8mb4
	dsn := strings.Join([]string{cfg.MySQLUserName, ":", cfg.MySQLPassWord, "@tcp(", cfg.MySQLHost, ":", cfg.MySQLPort, ")/" + cfg.MySQLDb, "?charset=utf8mb4&parseTime=True&loc=Local"}, "")
	db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{
		Logger: logger.Default.LogMode(logger.Info),
	})
	if err != nil {
		panic(err)
	}
	sqlDB, _ := db.DB()
	// SetMaxIdleConns 设置空闲连接池中连接的最大数量
	sqlDB.SetMaxIdleConns(10)
	// SetMaxOpenConns 设置打开数据库连接的最大数量。
	sqlDB.SetMaxOpenConns(100)
	// SetConnMaxLifetime 设置了连接可复用的最大时间。
	sqlDB.SetConnMaxLifetime(time.Hour)

	// ES启动
	es_client, err = elastic.NewClient(
		elastic.SetURL(strings.Join([]string{"http://", cfg.ESHost, ":", cfg.ESPort}, "")),
		elastic.SetSniff(false),
		elastic.SetHealthcheck(false),
	)
	if err != nil {
		log.Fatal("Error creating Elasticsearch client: ", err)
	}

	// Redis
	pool_size := 20
	pool = redis.NewPool(func() (redis.Conn, error) {
		c, err := redis.Dial("tcp", strings.Join([]string{cfg.RedisHost, ":", cfg.RedisPort}, ""))
		if err != nil {
			return nil, err
		}
		return c, nil
	}, pool_size)
}

func GetDB() *gorm.DB {
	return db
}

func GetRedisConn() redis.Conn {
	return pool.Get()
}

func GetES() *elastic.Client {
	return es_client
}

func VideoFill(video entity.Video) entity.Video {
	video.Url = strings.Join([]string{"http://", Domain, "/", video.Key}, "")
	video.Cover = strings.Join([]string{"http://", Domain, "/", video.Cover}, "")
	return video
}

func VideosFill(videos []entity.Video) []entity.Video {
	for i := 0; i < len(videos); i++ {
		videos[i].Url = strings.Join([]string{"http://", Domain, "/", videos[i].Key}, "")
		videos[i].Cover = strings.Join([]string{"http://", Domain, "/", videos[i].Cover}, "")
	}
	return videos
}
